iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

Java程式的組織形式

java 是一種純粹的物件導向的程式語言,必須以類別(Class)的形式存在,因此類別是Java的最小程式單位,不允許可執行的語句、方法獨立存在

昨天提到的HelloWorld.java城市是一個簡單的程式,但還不是最簡單的

最簡單的是像這樣只包含一個空類別定義的程式

public class Simplest {

}

如果使用javac來編譯這個程式,可以順利編譯沒有問題

但如果用java 來命令來執行Simplest會得到以下錯誤
https://ithelp.ithome.com.tw/upload/images/20230917/20163139Sz94U6FkXf.png
因為Java直譯器規定 : 如果某個類別能被直譯器直接解譯執行,則這個類別必須包含main方法,而且必須用public static void 來修飾,且main 方法的形式參數必須是字串陣列類型的(String[] args)

所以main方法的寫法幾乎是固定的!除public static 可以互換位置之外,其他部分是固定的

public static void main(String[] args) {
}

對於那些不包含main 方法的類別,也是有用的,在一個大型的Java程式,往往只需要一個類別包含main方法,其他類別都是用於被main 方法直接或間接呼叫的

Java 原始檔的命名規則

  1. 原始檔的後綴必須是.java

  2. 通常情況,Java原始檔主檔名可以是任意的,但如果原始碼裡定義了一個public 的類別,該原始檔必須與該public 類別的類別名稱相同

    (一個原始檔可以含有多個類別,但只能包含一個public 類別)

小提醒:雖然Java原始檔主檔名可以是任意的,為了有更好的可讀性

  1. 一個java原始檔只定義一個類別,不同類別使用不同原始檔定義
  2. 讓原始檔與該public 類別的類別名稱相同

垃圾回收機制

https://ithelp.ithome.com.tw/upload/images/20230917/20163139zALPhtGC7G.png

我們需要知道在執行時期,記憶體區間可分為三個部份:

  1. Global (全域)

  2. Stack (堆疊)

  3. Heap (堆積)

Global 全域

放置全域變數(global variable)、靜態變數(static variable)

Stack 推疊區

作業系統會自動化管理這個區塊,而要讓系統可以清楚的管理這些資訊,代表裡面存放的東西必須事先可以被計算好它的生命週期。這個區塊主要用來存放:區域變數(local variable)、方法的參數(method parameter)與方法的回傳位址(method return address)等。

如果Stack區不夠用或是遞回涵式(recursive function)沒寫好,會產 StackOverflowError 。

Heap 堆積區

很多時候程式在執行時期才會知道要使用多少記憶體,而且該區塊的記憶體不知道什麼時候會不需要使用,通常透過new關鍵字的東西會被存放在這邊

這裡的資料系統不會自動回收,沒錯,所以隨著程式執行記憶體會越來越少,所以程式設計師必須自行管理此區的記憶體,但Java還是一貫很貼心的有機制會幫你清理這個Heap區,這個機制叫做『Garbage Collection 垃圾回收機制』

垃圾回收機制

這是一種動態儲存管理技術,會自動釋放不再被程式參照的物件,除了釋放沒用的物件外,也可以清除記憶體紀錄碎片!碎片是分配給物件的記憶體區塊之間的空閒記憶體區,碎片整理將所佔用的堆積記憶體一到堆積的另一端,JVM將整理出記憶體分配給新的物件。

優點:

  1. 提高程式設計效率→不用解決記憶體的問題
  2. 保護程式的完整性→安全性好

缺點:

  1. 影響程式效能

    →因為要追蹤程式有用的物件才可以確定哪些物件是無用的

  2. 垃圾回收演算法的不完備性

    →不能保證100%收集到所有廢棄記憶體

特點:

  1. 只能回收記憶體資源,對其實體資源,如:資料庫連接,磁碟I/O無能為力
  2. 為了更快讓垃圾回收機制回收不再使用的物件可以將該物件的參照設置為null

那我們今天就到這邊囉!


上一篇
Day2 建置Java環境及第一支Java 程式
下一篇
Day4-資料類型I
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言